#ifndef LINK_H
	#define LINK_H

#define LINKISEMPTY -1					//链表为空
#define MORELENGTH  -2					//超出链表长度
#define MEMORYMALLOCFALSE -3				//内存申请失败
#define LINKNOTINIT -4					//链表没有初始化
#define ITERNOTINIT 0					//迭代器指针为空

#define TRUE		1
#define FALSE	0
#define NULL		0

typedef int datatype;								//节点的关键字的类型

typedef struct node_ {								//声明一个节点
	datatype key;
	struct node_* next;
} node_t;

struct link_ {										//声明一个单链表
	node_t* node;
	int size;
};
typedef struct link_  plink_t;
typedef struct link_* link_t;

struct iterator_ {									//声明一个迭代器
	node_t* iter;
	_Bool used;
};
typedef struct iterator_* iterator_t;

link_t InitLink();									//初始化链表

link_t Copy(link_t link);							//拷贝一个副本，在内存中与原本地址不同

int Connect(link_t link1, link_t link2);				//连接两个链表

int Append(link_t link, datatype key);				//添加一个节点

int Extend(link_t link, datatype* keys, int len);		//添加多个节点

int Insert(link_t link, int index, datatype key);		//在链表的第index位置插入节点

int Modify(link_t link, int index, datatype key);		//修改下标为index的节点的关键字

datatype Pop(link_t link);							//弹出链尾节点

datatype Key(link_t link, unsigned int index);		//获取下标为index的节点的关键字

int Delete(link_t link, unsigned int index);			//删除下标为index的节点

int Remove(link_t link, datatype key);				//删除链表中关键字为data的节点

int Clear(link_t link);								//清空链表

int Index(link_t link, datatype key);					//获取链表中第一个关键字为data的节点的下标，不存在则返回-1

void Sort(link_t link, _Bool modl);					//对链表进行正序或逆序排序

void Reverse(link_t link);							//颠倒链表

int Length(link_t link);								//计算链表的长度

int Count(link_t link, datatype key);		    			//计算data在链表中出现的次数

_Bool Equal(link_t link1, link_t link2);				//比较两个链表中的关键字是否相等

void Destroy(link_t* link);							//销毁链表

node_t* CreateNode(datatype key);						//创建节点

void sortData(datatype* num, int len);				//冒泡排序	

iterator_t GetIterator(link_t link);					//获取一个迭代器

_Bool Next(iterator_t iterator);						//判断迭代器是否

datatype GetKey(iterator_t iterator);					//获取迭代器当前指向的关键字

#endif